package cn.dduan.fool.serializable;

import java.io.*;

/**
 * Java 原生序列化
 * <p>
 * 原理：
 * <p>
 * 1. Java 原生序列化是基于 java.io.Serializable 接口和 java.io.Externalizable 接口实现的
 * 2. 实现 Serializable 接口是一种标记接口，它告诉 Java 虚拟机该类的对象可以被序列化
 * 3. Java 会自动处理对象的序列化和反序列化过程。而 Externalizable 接口继承自 Serializable，但它要求实现类自行定义序列化和反序列化的逻辑
 * <p>
 * 优缺点：
 * <p>
 * 1. 优点：简单易用，Java 内置支持，无需额外引入依赖
 * 2. 缺点：序列化后的字节码较大，性能相对较低；跨语言支持较差，只能在 Java 环境中使用
 *
 * @author dduan
 * @version 1.0
 * @date 2025/2/27
 */
public class MySerializable {
    public static void main(String[] args) {
        Person person = new Person("张三", 18);

        // 序列化
        try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.ser"))) {
            oos.writeObject(person);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 反序列化
        try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser"))) {
            Person deserializedPerson = (Person) ois.readObject();
            System.out.println("Name: " + deserializedPerson.getName() + ", Age: " + deserializedPerson.getAge());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}

class Person implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
